
#pragma once

#include "atr/containers/modifiers/erase.hpp"
#include "atr/containers/modifiers/insert.hpp"
#include "atr/containers/modifiers/pop.hpp"
#include "atr/containers/modifiers/push.hpp"

namespace atr {

/**
 * @brief Namespace only for internal use of atr library
 * @details Please don't use this namespace outside the atr library. IF you REALLY need to - do it with special care.
 */
namespace __ {

template <template <class ...> class Base, class ... Types>
struct __modifiers
    : public __pop<Base<>, Base<Types...>>
    , public __push<Base<Types...>>
{

    template <class Position, class ... NewTypes>
    using insert = typename __insert<Base<Types...>,Position,NewTypes...>::type;

    template <class Position, class ... OldTypes>
    using erase = typename __erase<Base<Types...>, Position, OldTypes...>::type;

    template <class NewType>
    using swap = NewType;

    using clear = Base<>;

};

} // namespace __
} // namespace atr